package com.vvv.designpattern.dprecated.state;

import org.springframework.stereotype.Component;

import javax.annotation.Resource;

/**
 * @author vvv
 * @date 2023-11-20 10 53
 * discription DeprecatedOrderContext是状态模式的上下文角色
 * 作用是封装状态的转换逻辑，并且是直接暴露给客户端使用的
 * 因此本业务的DeprecatedOrderContext需要提供4个入口方法对应4个不同的状态转换方法
 *
 * 状态模式的通用UML类图是在DeprecatedOrderContext类中维护一个当前状态的
 * 也就是DeprecatedOrderContext类中维护这个属性 DeprecatedAbstractOrderState currentState; 这个属性存储的就是当前订单的状态
 * 也就是DeprecatedOrderContext的各个方法需要去改变currentState成员变量，实现状态的转换，
 *
 * 但是DeprecatedOrderContext是需要交给spring进行管理的
 * 也就是DeprecatedOrderContext是单例的，那么如果DeprecatedOrderContext类中有可变的共享变量的话会出现线程安全问题。
 * 比如线程1修改了currentState然后线程2页修改了currentSate，当线程1再去修改currentState时，就会发现对不上号了
 *
 * 1. 要么我们让DeprecatedOrderContext交给spring进行管理
 * 我们只能让DeprecatedOrderContext类的属性是不可变的，也就是DeprecatedOrderContext类的属性是无状态的，也就是去掉currentState属性
 * 直接注入4个具体的状态角色进行相应的处理
 *
 * 2. 要么我们不将DeprecatedOrderContext交给spring管理，也就是一个订单对应一个DeprecatedOrderContext对象
 *
 * 下面的实现使用的是交给spring管理的方式1
 *
 * 在spring状态机中使用的是方式2，也就是不同订单对应不同的状态机（context）
 */

// @Component注解: 说明这个类是被spring管理的，是单例的，所以DeprecatedOrderContext类中不能保存任何状态（currentState）
@Component
public class DeprecatedOrderContext {

    @Resource
    private DeprecatedCreateOrder deprecatedCreateOrder;

    @Resource
    private DeprecatedPayOrder deprecatedPayOrder;

    @Resource
    private DeprecatedSendOrder deprecatedSendOrder;

    @Resource
    private DeprecatedReceiveOrder deprecatedReceiveOrder;

    public DeprecatedOrder createOrder(String orderId, String productId) {
        return deprecatedCreateOrder.createOrder(orderId, productId);
    }

    public DeprecatedOrder payOrder(String orderId) {
        return deprecatedPayOrder.payOrder(orderId);
    }

    public DeprecatedOrder sendOrder(String orderId) {
        return deprecatedSendOrder.sendOrder(orderId);
    }

    public DeprecatedOrder receiveOrder(String orderId) {
        return deprecatedReceiveOrder.receiverOrder(orderId);
    }
}
